<?php

declare(strict_types=1);

namespace App\Middlewares;

use App\Helpers\Auth;
use App\Helpers\URL;
use App\Repositories\AuthRepository;
use App\Validations\AuthValidation;
use Riverside\Express\Request;
use Riverside\Express\Response;

/**
 * Middleware que comprueba la autenticación de un usuario.
 */
class AuthMiddleware
{
    /**
     * Comprueba la cookie de autenticación de un usuario.
     */
    public function check(Request $req, Response $res): void
    {
        // Obtiene la cookie de autenticación.
        $cookie = $req->cookies[Auth::getCookieVarname()] ?? null;

        $gump = $req->app->local('gump');

        // Obtiene las reglas de validación.
        $rules = (new AuthValidation)->getRules('cookie', true);

        // Comprueba la información de la cookie.
        if ($gump->validate(['cookie' => $cookie], $rules) !== true) {
            $res->redirect(URL::site('login'));
        }

        $userAuth = (new AuthRepository)->findUserAuthById($cookie);

        // Comprueba la información del usuario autenticado.
        if (empty($userAuth)) {
            $req->session['error'] = 'Tu cuenta de usuario no tiene acceso';

            $res->redirect(URL::site('logout'));
        }

        // Se pasa el usuario autenticado en los controladores.
        $req->app->local(Auth::getVarname(), $userAuth);
    }

    /**
     * Redirecciona a una ruta si el usuario se encuentra autenticado.
     */
    public function redirect(Request $req, Response $res): void
    {
        if (isset($req->cookies[Auth::getCookieVarname()])) {
            $res->redirect(URL::site('contacts'));
        }
    }
}
